package com.maas.util.mybatis.jpa.littlenb.annotation.mapper;

import com.littlenb.mybatisjpa.type.SelectorStrategy;
import com.maas.util.mybatis.jpa.littlenb.support.constant.JpaConstant;
import com.maas.util.mybatis.jpa.littlenb.support.template.select.SelectIgnoreNullSqlTemplate;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * 修改自mybatis-jpa
 * mapper 内方法的注解
 * 使其支持SelectStatementFactory
 * 传入参数不能为string
 * #####例子
 * <p>例子1 ：</p>
 *        @SelectDefinition(strategy = SelectorStrategy.CERTAIN,where = "id =#{"+ Constant.CERTAINTY_ENTITY_KEY+".id}", domainClass = SurveyDirectory.class)
 *      	SurveyDirectory getById(Certainty<SurveyDirectory> certainty );
 *         SurveyDirectory surveyDetail = new SurveyDirectory();
 *         surveyDetail.setId(id);
 *         Certainty<SurveyDirectory> certainty  = CertaintyUtil.createCertainty(surveyDetail,"id");
 *         return  mapper.getById(certainty);
 *
 * <p>例子2  **Page 会使用分页插件</p>
 * @SelectDefinition(strategy = SelectorStrategy.CERTAIN,where = "", domainClass = SurveyDirectory.class)
 * List<SurveyDirectory> getJbaListPage(@Param("entity") Certainty<SurveyDirectory> certainty, @Param("page") Page page);
 *
 * 	    	SurveyDirectory getById(Certainty<SurveyDirectory> certainty );
 *         SurveyDirectory surveyDetail = new SurveyDirectory();
 *         surveyDetail.setId(id);
String[] includeArr ={"visibility","dirType","surveyModel"};
Certainty<SurveyDirectory> certainty  = CertaintyUtil.createCertainty(entity,includeArr);
 *         return  mapper.getJbaListPage(certainty,page);
 *
 *  <p>例子3  ** 模拟 mybatis plus 的 queryWrapper</p>
 *  @SelectDefinition(strategy = SelectorStrategy.WRAPPER,where = "", domainClass = KbFaqQuestions.class)
 *
 * #####常见问题
 * 1.返回数据有些字段无法获取到值 ，加上 @Column(name="xxxx")试试
 *
 * @author zxm
 **/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SelectDefinition  {


  /**
   1. IGNORE_NULL
   * @SelectDefinition( where   此时where 无效 。。。

  2. CERTAIN
   * 如userId 查询
   * @SelectDefinition( where ="userId = #{"+ Constant.CERTAINTY_ENTITY_KEY+".userId}" 。。。

   *  不限制查询字段
   * @SelectDefinition( where ="" 。。。

  3.SelectorStrategy.NONE
   *  不限制查询字段
   * @SelectDefinition( where ="userId = #{userId}" 。。。
   */

  SelectorStrategy strategy() default SelectorStrategy.NONE;

  /**
   * default ""
   * 指定查询语句
   * 例子1 where = "id = #{id}“
   * 例子2 where = " survey_id = #{certainty."+ Constant.CERTAINTY_ENTITY_KEY+".surveyId} and " +
   * 					" handle_state "+ OperateConst.LESSTHAN +" #{certainty."+ Constant.CERTAINTY_ENTITY_KEY+".handleState} "
   */
  String where() default "";

  /**
   * 排序
   * default id = #{id}
   */
  String order() default JpaConstant.DEF_ID_ORDER;


  /**
   * 从 mybatis-jpa-jack 移植过来的
   * 持久化Entity类型，用于解析数据库返回的数据
   * @return
   */
  Class<?> domainClass();


  /**
   *  certain条件构造器  指定参数名称
   *
   */
  String certainName() default "";


  /**
   * midify 参数名称
   * @return
   */
  String modifyName() default "";



  /**
   *  查询为不等于的字段
   *  TODO 实现 PropertyFilter 的条件过滤功能
   *
   */
  String[] neFeildArr() default {};

  /**
   * 需要模糊查询的字段
   * @return
   */
  String[] likeFeildArr() default {};


  /**
   *  查询参数  实现NVL(,0) 的功能
   *  TODO 实现 PropertyFilter 的条件过滤功能
   *
   */
  String[] emptyEqFeildArr() default {};


  /**
   * 返回值类型 默认是domainClass
   * @return
   */
  Class  resultType()  default SelectDefinition.class;

  /**
   * mybatis resultMap id：
   *
   *
   * 0 为不设置， 默认是domainClass对应的resultMap
   *             ResultMapConstants.DEFAULT_NAMESPACE= "jpa.result.map";
   *             String adapterResultMapId = ResultMapConstants.DEFAULT_NAMESPACE + "." + persistentMeta.getEntityName();
   * @return
   */
  String resultMapId()  default "";

  /**
   * 分组统计功能 groupBy
   * 如
   *  @SelectDefinition(strategy = SelectorStrategy.CERTAIN,where = "", domainClass =AnRadio.class,certainName = "certainty"
   * 	,selectParm = "qu_item_id,count(qu_item_id) ",resultType = Object.class,resultMapId ="0",groupBy="qu_item_id")
   *     List<Object[]> findGroupStats(@Param("certainty") Certainty<AnRadio> certainty);
   *
   *   其中需要特别注意的四个参数：  SelectorStrategy.CERTAIN，resultType = Object.class,resultMapId ="0",groupBy="qu_item_id"
   * @return
   */
  String groupBy() default "";


  /**
   * 查询 的字段
   *
   *  如 qu_item_id,count(qu_item_id) count
   */
  String selectParm() default "";

  /**
   * 日期参数
   * @return
   */
  String[] dateParm()  default  {};

  /**
   *日期参数的属性
   * @return
   */
  String[] dateSearch()  default  {};
}
